1. /* sfmredc.cpp by K.Tsuru */
  2. // function ID = 701 DRADIX
  3. /*************************************
  4. SFraction class
  5. It provides the reduction of fraction.
  6. **************************************/
  7. #ifndef SN_H
  8. #include "sn.h"
  9. #endif
  10. #if REDUCE_SIZE
  11. static const uint initReduceSize = 512; //initial value of "reduceSize"
  12. uint SFraction::reduceSize = initReduceSize;
  13. bool SFraction::reduceStepByStep = true;
  14. void SFraction::reduce(bool must){
  15. #else
  16. void SFraction::reduce(){
  17. #endif
  18. if( !num.Sign(701) ){ SetZero(); return; } //denominator=0
  19. if( num.IsOne() || den.IsOne() ) reduceDone = true; //denominator or numerator=1
  20. if( reduceDone == true ) return;
  21. // reduceDone = FALSE
  22. //To reduce as late as possible It divides by 2^b*R^r.
  23. if( !(num[0] % 2u) && !(den[0] % 2u) ) ReduceByPow2Rdx(num, den);
  24. #if REDUCE_SIZE
  25. if( !must && ( max( num.Head(), den.Head() ) < ReduceSize() )) return;
  26. #endif
  27. //reduction
  28. SLong d = gcdL(num, den); // d > 0
  29. num /= d; den /= d;
  30. reduceDone = true;
  31. #if REDUCE_SIZE
  32. /*
  33. When the calculation of large figures continues inspite of reduction,
  34. it enlarges the value of "reduceSize".
  35. */
  36. uint rds = min(num.Head(), den.Head()) +1u;
  37. if(rds > ReduceSize()) SetReduceSize( min(4u*rds, num.MaxSize()) );
  38. else SetReduceSize(initReduceSize);
  39. #endif
  40. }

sfmredc.cpp : last modifiled at 2017/10/23 10:04:49(1,334 bytes)
created at 2015/12/22 16:07:29
The creation time of this html file is 2017/10/23 11:28:46 (Mon Oct 23 11:28:46 2017).